package com.it.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

public class JwtUtil {

    /**
     * 生成 JWT
     *
     * @param secretKey jwt 秘钥
     * @param ttlMillis 过期时间（毫秒）
     * @param claims    载荷数据
     * @return 生成的 token
     */
    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));

        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        return Jwts.builder()
                .claims(claims)
                .expiration(exp)
                .signWith(key, SignatureAlgorithm.HS256) // 对称加密签名
                .compact();
    }

    /**
     * 解析 JWT
     *
     * @param secretKey jwt 秘钥
     * @param token     token
     * @return 载荷 Claims
     */
    public static Claims parseJWT(String secretKey, String token) {
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));

        return Jwts.parser()
                .verifyWith(key) // 0.12.6 要用 SecretKey
                .build()
                .parseSignedClaims(token)
                .getPayload();
    }
}
